﻿using System.Linq;
using System.ServiceModel.DomainServices.Client.ApplicationServices;
using System.Windows;
using System.Windows.Navigation;
using RIABlog.Web.Models;

namespace RIABlog.Views
{

    public partial class EditMyBlog : BlogPageBase
    {
        /// <summary>
        /// Новая сущность
        /// </summary>
        private Blog _blog;

        public EditMyBlog()
        {
            InitializeComponent();
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            string userName = WebContext.Current.User.Name;

            // ищем блог у текущего пользователя
            this._blog = this.BlogContext.Blogs.FirstOrDefault
                (
                    blog => blog.Author == userName
                );

            if(this._blog == null) // будем создавать новую сущность
            {
                this.formNewBlog.Header = ApplicationStrings.CreateMyBlogPageTitle;

                // создаем и добавляем новую сущность в коллекцию
                this._blog = new Blog
                    {
                        Title = string.Format(ApplicationStrings.BlogDefaultNameText, userName),
                        Author = userName // Это свойство все равно будет выставлено еще раз на сервере, но нам нужно его задать здесь сразу, чтобы правильно работало обновление меню
                    };

                this.BlogContext.Blogs.Add(this._blog);
            }
            else // будем редактировать существующую
            {
				this.formNewBlog.Header = ApplicationStrings.EditMyBlogPageTitle;
            }

			this.formNewBlog.CurrentItem = this._blog;

			// добавляем отмену изменений в случае выхода
			WebContext.Current.Authentication.LoggedOut += this.AuthenticationEventHandler;
        }

		protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
		{
            // проверяем, прошла ли валидация
            if (!this.formNewBlog.IsItemValid)
            {
                e.Cancel = true;
                return;
            }

            this.formNewBlog.CommitEdit();

			base.OnNavigatingFrom(e);

			// здесь обязательно нужно отписываться
			WebContext.Current.Authentication.LoggedOut -= this.AuthenticationEventHandler;
		}

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
			// проверяем, прошла ли валидация
			if(!this.formNewBlog.IsItemValid)
			{
				return;
			}

            // фиксируем изменения на форме
        	this.formNewBlog.CommitEdit();

			// сохраняем изменения
            this.SaveChanges();
        }

        private void btnRemove_Click(object sender, RoutedEventArgs e)
        {
            if(MessageBox.Show(ApplicationStrings.RemoveQueryText, ApplicationStrings.QuestionText, MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
            {
                return;
            }

            // отменяем изменения, на случай, если данные на форме редактировали
        	this.formNewBlog.CancelEdit();

            // удаляем блог из списка и сохраняем изменения
            this.BlogContext.Blogs.Remove(this._blog);
			this.SaveChanges();
		}

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            // отменяем изменения, на случай, если данные на форме редактировали
            this.formNewBlog.CancelEdit();

            this.BlogContext.RejectChanges();
            this.NavigateHome();
        }

		private void AuthenticationEventHandler(object sender, AuthenticationEventArgs evt)
		{
			this.btnCancel_Click(sender, null);
		}
    }
}
